]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
dnd: Centralize drag actor positioning code, use shellWorkspaceLaunch for workspaces
authorColin Walters <walters@verbum.org>
Tue, 18 Aug 2009 00:29:54 +0000 (20:29 -0400)
committerColin Walters <walters@verbum.org>
Thu, 20 Aug 2009 23:37:50 +0000 (19:37 -0400)
We had multiple copies of the code to position a drag actor given a particular
source.  Instead, just put it inside dnd.js.

Second, rather than test for GenericDisplay/WellDisplayItem etc.,
in various places, add a new method on each source "shellWorkspaceLaunch"
which both marks the item as being droppable on a workspace, and is
called by the workspaces code to launch the item.

js/ui/appDisplay.js
js/ui/dnd.js
js/ui/docDisplay.js
js/ui/genericDisplay.js
js/ui/workspaces.js

index a278e5e4b2293ed11d4abb88041d1046e674da3d..d69a3b5a604feea64458d11370ad19a4747127e3 100644 (file)
@@ -76,6 +76,10 @@ AppDisplayItem.prototype = {
     // Returns a preview icon for the item.
     _createPreviewIcon : function() {
         return this._appInfo.create_icon_texture(GenericDisplay.PREVIEW_ICON_SIZE);
+    },
+
+    shellWorkspaceLaunch: function() {
+        this.launch();
     }
 };
 
@@ -540,21 +544,12 @@ WellDisplayItem.prototype = {
         this.appInfo.launch();
     },
 
-    // Draggable interface - FIXME deduplicate with GenericDisplay
+    shellWorkspaceLaunch : function() {
+        this.launch();
+    },
+
     getDragActor: function(stageX, stageY) {
-        this.dragActor = this.appInfo.create_icon_texture(APP_ICON_SIZE);
-
-        // If the user dragged from the icon itself, then position
-        // the dragActor over the original icon. Otherwise center it
-        // around the pointer
-        let [iconX, iconY] = this._icon.get_transformed_position();
-        let [iconWidth, iconHeight] = this._icon.get_transformed_size();
-        if (stageX > iconX && stageX <= iconX + iconWidth &&
-            stageY > iconY && stageY <= iconY + iconHeight)
-            this.dragActor.set_position(iconX, iconY);
-        else
-            this.dragActor.set_position(stageX - this.dragActor.width / 2, stageY - this.dragActor.height / 2);
-        return this.dragActor;
+        return this.appInfo.create_icon_texture(APP_ICON_SIZE);
     },
 
     // Returns the original icon that is being used as a source for the cloned texture
index 2eb5f789eaf82457a5e3cf9091dde8e02d012d49..87cb5d8e9a2be5c1f2c6cb252b4b6c85c44295d9 100644 (file)
@@ -82,10 +82,21 @@ _Draggable.prototype = {
                 // Drag actor does not always have to be the same as actor. For example drag actor
                 // can be an image that's part of the actor. So to perform "snap back" correctly we need
                 // to know what was the drag actor source.
-                if (this.actor._delegate.getDragActorSource)
+                if (this.actor._delegate.getDragActorSource) {
                     this._dragActorSource = this.actor._delegate.getDragActorSource();
-                else  
+                    // If the user dragged from the source, then position
+                    // the dragActor over it. Otherwise, center it
+                    // around the pointer
+                    let [sourceX, sourceY] = this._dragActorSource.get_transformed_position();
+                    let [sourceWidth, sourceHeight] = this._dragActorSource.get_transformed_size();
+                    if (stageX > sourceX && stageX <= sourceX + sourceWidth &&
+                        stageY > sourceY && stageY <= sourceY + sourceHeight)
+                        this._dragActor.set_position(sourceX, sourceY);
+                    else
+                        this._dragActor.set_position(stageX - this._dragActor.width / 2, stageY - this._dragActor.height / 2);
+                } else {
                     this._dragActorSource = this.actor;
+                }
                 this._dragOrigParent = undefined;
                 this._ungrabActor(actor);
                 this._grabActor(this._dragActor);
index 8dd133966625a3aad872d4e6f2d9b58d21cd5bec..605d7f8c947b831b508d3e4d1cd34761fb3ad1d0 100644 (file)
@@ -83,9 +83,15 @@ DocDisplayItem.prototype = {
         }
     },
 
+    //// Drag and Drop ////
+
+    shellWorkspaceLaunch: function() {
+        this.launch();
+    },
+
     //// Private Methods ////
 
-    // Updates the last visited time displayed in the description text for the item. 
+    // Updates the last visited time displayed in the description text for the item.
     _resetTimeDisplay: function(currentSecs) {
         let lastSecs = this._docInfo.timestamp;
         let timeDelta = currentSecs - lastSecs;
index 6f1347791e8ef3c34ce8afa7843a76b16e927796..b874bc9418f71d792b33dd05c6ae46d5670b25e1 100644 (file)
@@ -126,8 +126,6 @@ GenericDisplayItem.prototype = {
         // It is used for updating the description text inside the details actor when
         // the description text for the item is updated.
         this._detailsDescriptions = [];
-
-        this.dragActor = null;
     },
 
     //// Draggable object interface ////
@@ -135,21 +133,9 @@ GenericDisplayItem.prototype = {
     // Returns a cloned texture of the item's icon to represent the item as it 
     // is being dragged. 
     getDragActor: function(stageX, stageY) {
-        this.dragActor = this._createIcon();
-
-        // If the user dragged from the icon itself, then position
-        // the dragActor over the original icon. Otherwise center it
-        // around the pointer
-        let [iconX, iconY] = this._icon.get_transformed_position();
-        let [iconWidth, iconHeight] = this._icon.get_transformed_size();
-        if (stageX > iconX && stageX <= iconX + iconWidth &&
-            stageY > iconY && stageY <= iconY + iconHeight)
-            this.dragActor.set_position(iconX, iconY);
-        else
-            this.dragActor.set_position(stageX - this.dragActor.width / 2, stageY - this.dragActor.height / 2);
-        return this.dragActor;
+        return this._createIcon();
     },
-    
+
     // Returns the item icon, a separate copy of which is used to
     // represent the item as it is being dragged. This is used to
     // determine a snap-back location for the drag icon if it does
index 39e2cd48f4d49e28b80955a6b286e1cabb2cf589..7fa0bb1ac3bdcfdfdf4a98e3cd392ddf15c341b8 100644 (file)
@@ -11,9 +11,7 @@ const Pango = imports.gi.Pango;
 const Shell = imports.gi.Shell;
 const Signals = imports.signals;
 
-const AppDisplay = imports.ui.appDisplay;
 const DND = imports.ui.dnd;
-const GenericDisplay = imports.ui.genericDisplay;
 const Main = imports.ui.main;
 const Overview = imports.ui.overview;
 const Panel = imports.ui.panel;
@@ -855,9 +853,9 @@ Workspace.prototype = {
                                                  false, // don't create workspace
                                                  time);
             return true;
-        } else if (source instanceof GenericDisplay.GenericDisplayItem || source instanceof AppDisplay.WellDisplayItem) {
+        } else if (source.shellWorkspaceLaunch) {
             this._metaWorkspace.activate(time);
-            source.launch();
+            source.shellWorkspaceLaunch();
             return true;
         }